package opencm.cli;

import opencm.Consulta;
import opencm.DiaSemana;
import opencm.Horario;
import opencm.Main;
import opencm.Medico;
import opencm.RepositorioMedico;

import org.joda.time.LocalTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class CadastrarHorario extends Acao {

	private final RepositorioMedico medicos;
	
	public CadastrarHorario() {
		this.medicos = Main.repositorioMedico;
	}

	@Override
	public String toString() {
		return "Cadastrar Horário de Atendimento";
	}

	public void executar() {
		if (this.medicos.contar() == 0) {
			System.out.printf("Nenhum Médico.%nVocê deve cadastrar pelo menos um Médico.%n");
			System.exit(0);
		}
		
		Medico medico = null;
		Horario horario = null;
		while(true) {
			try {
				medico = selecionarUm("Médico", this.medicos.pesquisar());
				Consulta.Tipo tipoConsulta = selecionarUm("Tipo de Consulta", Consulta.Tipo.toList());
				DiaSemana diaSemana  = selecionarUm("Dia da Semana", DiaSemana.toList());
				LocalTime inicio = readHora("Hora Inicial [00:00]");
				LocalTime fim = readHora("Hora Final [00:00]");
				
				horario = new Horario(tipoConsulta, diaSemana, inicio, fim);
				medico.adicionarHorario(horario);
				break;
			} catch (IllegalArgumentException e) {
				out.println(e.getMessage());
			}
		}
		
		out.printf("Horário adicionado com sucesso!%n");
		out.printf("%n");
		out.printf("%20s: %s%n", "Médico", medico.getPerfil().getNome());
		out.printf("%20s: %s%n", "Tipo de Consulta", horario.getTipo().toString());
		out.printf("%20s: %s%n", "Dia da Semana", horario.getDiaSemana().toString());
		out.printf("%20s: %s%n", "Hora Inicial", horario.getInicio().toString());
		out.printf("%20s: %s%n", "Hora Final", horario.getFim().toString());
	}

	private LocalTime readHora(String prompt) {
		DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm");
		while(true) {
			try {
				return fmt.parseDateTime(readLine(prompt)).toLocalTime().withSecondOfMinute(0);
			} catch (IllegalArgumentException e) {
				out.println("Hora inválida.");
			}
		}	
	}
	
}
